home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Games / MAME / src / vidhrdw / aztarac.c < prev    next >
C/C++ Source or Header  |  2000-04-04  |  3KB  |  124 lines

  1. /*
  2.  * Aztarac vector generator emulation
  3.  *
  4.  * Jul 25 1999 by Mathis Rosenhauer
  5.  *
  6.  */
  7.  
  8. #include "driver.h"
  9. #include "vidhrdw/vector.h"
  10.  
  11. #define VEC_SHIFT 16
  12.  
  13. UINT8 *aztarac_vectorram;
  14.  
  15. static int xcenter, ycenter;
  16.  
  17. INLINE void read_vectorram (int addr, int *x, int *y, int *c)
  18. {
  19.     addr <<= 1;
  20.     *c = READ_WORD (&aztarac_vectorram[addr]) & 0xffff;
  21.     *x = READ_WORD (&aztarac_vectorram[addr + 0x1000]) & 0x03ff;
  22.     *y = READ_WORD (&aztarac_vectorram[addr + 0x2000]) & 0x03ff;
  23.     if (*x & 0x200) *x |= 0xfffffc00;
  24.     if (*y & 0x200) *y |= 0xfffffc00;
  25. }
  26.  
  27. INLINE void aztarac_vector (int x, int y, int color, int intensity)
  28. {
  29.     if (translucency) intensity *= 0.8;
  30.     vector_add_point (xcenter + (x << VEC_SHIFT), ycenter - (y << VEC_SHIFT), color, intensity);
  31. }
  32.  
  33. WRITE_HANDLER( aztarac_ubr_w )
  34. {
  35.     int x, y, c, intensity, xoffset, yoffset, color;
  36.     int defaddr, objaddr=0, ndefs;
  37.  
  38.     if (data & 1)
  39.     {
  40.         vector_clear_list();
  41.  
  42.         while (1)
  43.         {
  44.             read_vectorram (objaddr, &xoffset, &yoffset, &c);
  45.             objaddr++;
  46.  
  47.             if (c & 0x4000)
  48.                 break;
  49.  
  50.             if ((c & 0x2000) == 0)
  51.             {
  52.                 defaddr = (c >> 1) & 0x7ff;
  53.                 aztarac_vector (xoffset, yoffset, 0, 0);
  54.  
  55.                 read_vectorram (defaddr, &x, &ndefs, &c);
  56.                 ndefs++;
  57.  
  58.                 if (c)
  59.                 {
  60.                     /* latch color only once */
  61.                     intensity = c >> 8;
  62.                     color = c & 0x3f;
  63.                     while (ndefs--)
  64.                     {
  65.                         defaddr++;
  66.                         read_vectorram (defaddr, &x, &y, &c);
  67.                         if ((c & 0xff00) == 0)
  68.                             aztarac_vector (x + xoffset, y + yoffset, 0, 0);
  69.                         else
  70.                             aztarac_vector (x + xoffset, y + yoffset, color, intensity);
  71.                     }
  72.                 }
  73.                 else
  74.                 {
  75.                     /* latch color for every definition */
  76.                     while (ndefs--)
  77.                     {
  78.                         defaddr++;
  79.                         read_vectorram (defaddr, &x, &y, &c);
  80.                         aztarac_vector (x + xoffset, y + yoffset, c & 0x3f, c >> 8);
  81.                     }
  82.                 }
  83.             }
  84.         }
  85.     }
  86. }
  87.  
  88. int aztarac_vg_interrupt(void)
  89. {
  90.     return 4;
  91. }
  92.  
  93. void aztarac_init_colors (unsigned char *palette, unsigned short *colortable,const unsigned char *color_prom)
  94. {
  95.     int r, g, b, i;
  96.  
  97.     for (i = 4; i > 0; i--)
  98.         for (r = 0; r < 4; r++)
  99.             for (g = 0; g < 4; g++)
  100.                 for (b = 0; b < 4; b++)
  101.                 {
  102.                     *palette++ = (255 * r * i)/ 12;
  103.                     *palette++ = (255 * g * i)/ 12;
  104.                     *palette++ = (255 * b * i)/ 12;
  105.                 }
  106. }
  107.  
  108. int aztarac_vh_start (void)
  109. {
  110.     int xmin, xmax, ymin, ymax;
  111.  
  112.  
  113.     xmin = Machine->drv->visible_area.min_x;
  114.     ymin = Machine->drv->visible_area.min_y;
  115.     xmax = Machine->drv->visible_area.max_x;
  116.     ymax = Machine->drv->visible_area.max_y;
  117.  
  118.     xcenter=((xmax + xmin) / 2) << VEC_SHIFT;
  119.     ycenter=((ymax + ymin) / 2) << VEC_SHIFT;
  120.  
  121.     vector_set_shift (VEC_SHIFT);
  122.     return vector_vh_start();
  123. }
  124.